package com.rose.springbootgeneratefile.config;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * table标签的相关配置信息
 */
public class TableConfiguration extends PropertyHolder{
    public TableConfiguration(String tableName, String domainObjectName) {
        this.tableName = tableName;
        this.domainObjectName = domainObjectName;
    }

    /**
     * 数据库的catalog，如果设置了该值，生成SQL的表名会变成如catalog.tableName的形式。
     */
    private String catalog;

    /**
     *  数据库的schema,可以使用SQL通配符匹配。如果设置了该值，生成SQL的表名会变成如schema.tableName的形式。
     *
     *  数据仓库很多房间（schema），一个schema代表一个房间
     */
    private String schema;

    /**
     * 指定要生成的表名
     */
    private String tableName;
    /**
     * 这个值会用在生成的select查询SQL的表的别名和列名上。 列名会被别名为 alias_actualColumnName(别名_实际列名) 这种模式。
     */
    private String alias;

    /**
     * 是否给标识符增加分隔符
     * @return
     */
    private boolean delimitIdentifiers;
    /**
     * 生成对象的名称
     */
    private String domainObjectName;
    /**
     * 要忽略的列
     */
    private Map<IgnoredColumn, Boolean> ignoredColumns;

    private List<IgnoredColumnPattern> ignoredColumnPatterns = new ArrayList<IgnoredColumnPattern>();

    public String getDomainObjectName() {
        return domainObjectName;
    }

    public void setDomainObjectName(String domainObjectName) {
        this.domainObjectName = domainObjectName;
    }

    public boolean isDelimitIdentifiers() {
        return delimitIdentifiers;
    }

    public void setDelimitIdentifiers(boolean delimitIdentifiers) {
        this.delimitIdentifiers = delimitIdentifiers;
    }

    public String getAlias() {
        return alias;
    }

    public void setAlias(String alias) {
        this.alias = alias;
    }

    public String getCatalog() {
        return catalog;
    }

    public void setCatalog(String catalog) {
        this.catalog = catalog;
    }

    public String getSchema() {
        return schema;
    }

    public void setSchema(String schema) {
        this.schema = schema;
    }

    public String getTableName() {
        return tableName;
    }

    public void setTableName(String tableName) {
        this.tableName = tableName;
    }
    public void addIgnoredColumnPattern(IgnoredColumnPattern ignoredColumnPattern) {
        ignoredColumnPatterns.add(ignoredColumnPattern);
    }
    public boolean isColumnIgnored(String columnName) {
        for (Map.Entry<IgnoredColumn, Boolean> entry : ignoredColumns
                .entrySet()) {
            if (entry.getKey().matches(columnName)) {
                entry.setValue(Boolean.TRUE);
                return true;
            }
        }

        for (IgnoredColumnPattern ignoredColumnPattern : ignoredColumnPatterns) {
            if (ignoredColumnPattern.matches(columnName)) {
                return true;
            }
        }

        return false;
    }
}
